<?php
namespace app\app\controller;
use think\Controller;
class Oauth2 extends Controller{	//授权登录
	//参考QQ、新浪	https://www.cnblogs.com/xuyufeng/p/4881583.html
	//微信网页		https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
	//微信开发平台	https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=&lang=zh_CN
	public function _empty($name){
        die('非法访问！你的IP已被监控！');
    }
    public function authorize(){	//获取code
    	//【请求】
		// appkey	应用唯一标识
		// redirect_uri		授权后重定向的回调链接地址， 请使用 urlEncode 对链接进行处理 与后台设置的地址一致
		// response_type	返回类型，填写'code'
		// scope		应用授权作用域，填写'userinfo'=用户手动授权，拿到用户完整信息，'userinfo_base'=用户无感静默授权，拿到用户基本信息，'userinfo_omeright'=omeAPP内部静默授权，拿到用户完整信息
		// state		可选，重定向后会带上state参数，开发者可以填写a-zA-Z0-9的参数值，最多128字节，防止csrf劫持第三方账号。该值既不可预测，又必须可以证明应用（client）和当前第三方网站的登录认证状态存在关联（如果存在过期时间更好）。一种简单的方法是：随机算一个字符串，然后保存在session，回调时检查state参数和session里面的值。
		//【返回】
		// redirect_uri/?code=CODE&state=STATE。
		
		$appdata=apijieshou();
		//授权作用域
		if(!isset($appdata['scope']) || !in_array($appdata['scope'], ['userinfo','userinfo_base','userinfo_omeright'])){
			apifasong(['zt'=>'0','msg'=>'非法授权作用域']);
		}
		//应用合法性
		if(!isset($appdata['appkey'])){
			apifasong(['zt'=>'0','msg'=>'appkey不能为空']);
		}
		$app = db('app')->where('key',$appdata['appkey'])->find();
		if(!$app){
			apifasong(['zt'=>'0','msg'=>'应用未注册']);
		}elseif($app['zt']<>1){
			apifasong(['zt'=>'0','msg'=>'应用状态不可用']);
		}
		//回调地址
		if(!isset($appdata['redirect_uri'])){
			apifasong(['zt'=>'0','msg'=>'回调地址不能为空']);
		}else{
			$redirect_uri = urldecode($appdata['redirect_uri']);
			if(stripos(stristr($redirect_uri, '://'),$app['u_safe'])!==3){	//https://
				apifasong(['zt'=>'0','msg'=>'回调地址与绑定不一致']);
			}
		}
		//业务
		if(request()->isGet()){	//第三方get请求code
			die('开发中');
		}elseif(request()->isPost()){	//用户post授权
			//用户id是否传
			if(!isset($appdata['uid'])){
				apifasong(['zt'=>'0','msg'=>'非法用户']);
			}
			//用户是否同意授权
			if(!isset($appdata['allow']) || !$appdata['allow']){
				apifasong(['zt'=>'0','msg'=>'用户拒绝授权']);
			}
			//用户是否合法
			$userinfo = userinfobyid($appdata['uid']);
			if(!$userinfo){
				apifasong(['zt'=>'0','msg'=>'非法不存在']);
			}
			//生成code 60秒有效期
			$code = authcode($appdata['uid'], 'ENCODE', $app['key'], 60);
			$ret = db('app_login')->insertGetId([
				'appid'=>$app['id'],
				'uid'=>$appdata['uid'],
				'code'=>$code
			]);
			if(!$ret){
				apifasong(['zt'=>'0','msg'=>'系统错误']);
			}else{
				$redirect_uri = $appdata['redirect_uri'].'?code='.$code;
				$redirect_uri = isset($appdata['state'])?$redirect_uri.'&state='.$appdata['state']:$redirect_uri;
				if($appdata['scope']=='userinfo_omeright'){
					apifasong(['zt'=>'1','redirect_uri'=>$redirect_uri]);
				}else{
					$this->redirect($redirect_uri,302);
				}
			}
		}else{
			apifasong(['zt'=>'0','msg'=>'不支持的请求方式']);
		}
    }
    public function access_token(){	//用code换取access_token
    	//【请求】
    	// appkey	应用唯一标识
		// secret	应用密钥
		// code		填写第一步获取的code参数
		// grant_type	填写'authorization_code'
		// 【返回】
		// access_token	网页授权接口调用凭证
		// expires_in	access_token接口调用凭证超时时间，单位（秒）
		// refresh_token	用户下次刷新access_token的凭证
		// uid	用户唯一标识，加密后的uid
		// scope	用户授权的作用域，使用逗号（,）分隔
		
		$appdata=apijieshou();
		//合法性
		if(!isset($appdata['appkey'])){
			apifasong(['zt'=>'0','msg'=>'appkey不能为空']);
		}
		$app = db('app')->where('key',$appdata['appkey'])->find();
		if(!$app){
			apifasong(['zt'=>'0','msg'=>'应用未注册']);
		}elseif($app['zt']<>1){
			apifasong(['zt'=>'0','msg'=>'应用状态不可用']);
		}
		if($app['url']<>$appdata['header']['host']){
			apifasong(['zt'=>'0','msg'=>'请使用授权域名请求']);
		}
    }


    public function userinfo(){	//用access_token获取userinfo
    	die('userinfo');
    	// 【请求】
    	// access_token	网页授权接口调用凭证,注意：此access_token与基础支持的access_token不同
		// uid	用户唯一标识，加密后的uid
		// 【返回】
		// 用户信息json数组
    }

    public function refresh_token(){	//用refresh_token刷新access_token
    	die('refresh_token');
    	//【请求】
		// appkey	应用唯一标识
		// grant_type	填写refresh_token
		// refresh_token	填写通过access_token获取到的refresh_token参数
		// 【返回】
		// access_token	网页授权接口调用凭证
		// expires_in	access_token接口调用凭证超时时间，单位（秒）
		// refresh_token	用户下次刷新access_token的凭证
		// uid	用户唯一标识，加密后的uid
		// scope	用户授权的作用域，使用逗号（,）分隔
    }    
}
